openstack 中的Routes + webob 的 REST API 发表于 2014-11-12 | 分类于 Python | | ❤ 首先贴一段代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293from __future__ import print_functionfrom routes import Mapperimport webob.decimport webob.excimport routes.middlewareimport testtoolsclass MyController(object): def getlist(self, mykey): print("step 4: MyController's getlist(self, mykey) is invoked") return "getlist(), mykey=" + mykeyclass MyApplication(object): """Test application to call from router.""" def __init__(self, controller): self._controller = controller def __call__(self, environ, start_response): print("step 3: MyApplication is invoked") action_args = environ['wsgiorg.routing_args'][1].copy() try: del action_args['controller'] except KeyError: pass try: del action_args['format'] except KeyError: pass action = action_args.pop('action', None) controller_method = getattr(self._controller, action) result = controller_method(**action_args) start_response('200 OK', [('Content-Type', 'text/plain')]) return [result]class MyRouter(object): """Test router.""" def __init__(self): route_name = "dummy_route" route_path = "/dummies" my_application = MyApplication(MyController()) self.mapper = Mapper() self.mapper.connect(route_name, route_path, controller=my_application, action="getlist", mykey="myvalue", conditions={"method": ['GET']}) self._router = routes.middleware.RoutesMiddleware(self._dispatch, self.mapper) @webob.dec.wsgify(RequestClass=webob.Request) def __call__(self, req): """Route the incoming request to a controller based on self.map. If no match, return a 404. """ print("step 1: MyRouter is invoked") return self._router @staticmethod @webob.dec.wsgify(RequestClass=webob.Request) def _dispatch(req): """Dispatch the request to the appropriate controller. Called by self._router after matching the incoming request to a route and putting the information into req.environ. Either returns 404 or the routed WSGI app's response. """ print("step 2: RoutesMiddleware is invoked, calling our _dispatch back") match_dict = req.environ['wsgiorg.routing_args'][1] if not match_dict: return webob.exc.HTTPNotFound() app = match_dict['controller'] return app class RoutingTestCase(testtools.TestCase): def test_router(self): router = MyRouter() result = webob.Request.blank('/dummies').get_response(router) self.assertEqual(result.body, "getlist(), mykey=myvalue") 然后见博客中有较为详细的理解,但是要深入的话还是需要深入阅读文档 欢迎加入微信公众号 赏 微信打赏 支付宝打赏